import pandas as pd
import os
from datetime import datetime

def process_excel_by_person_in_charge(input_file, target_names):
    """
    根据项目负责人筛选数据并分别保存为单独的Excel文件
    参数:
    input_file: 输入的Excel文件路径
    target_names: 目标项目负责人姓名列表
    """
    try:
        # 读取Excel文件
        print(f"正在读取文件: {input_file}")
        df = pd.read_excel(input_file)
        # 数据预处理 - 清理可能的空行
        df = df.dropna(subset=['项目名称'])
        print(f"成功读取数据，共 {len(df)} 行")
        # 创建输出目录
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        output_dir = f'output_{timestamp}'
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
            print(f"创建输出目录: {output_dir}")
        results = {}

        # 处理每个目标项目负责人
        for name in target_names:
            # 筛选数据
            filtered_data = df[df['项目负责人'] == name].copy()
            if not filtered_data.empty:
                # 保存到单独的Excel文件
                output_filename = f'{name}负责的项目.xlsx'
                output_path = os.path.join(output_dir, output_filename)
                # 重置索引
                filtered_data.reset_index(drop=True, inplace=True)
                # 保存Excel文件
                filtered_data.to_excel(output_path, index=False, engine='openpyxl')
                results[name] = {
                    'count': len(filtered_data),
                    'total_funding': filtered_data['经费到账(万元)'].sum(),
                    'file_path': output_path,
                    'data': filtered_data
                }
                print(f"\n{name} 的项目:")
                print(f"  - 项目数量: {len(filtered_data)}")
                print(f"  - 总经费: {filtered_data['经费到账(万元)'].sum()}万元")
                print(f"  - 保存文件: {output_filename}")
                # 显示具体项目信息
                for idx, row in filtered_data.iterrows():
                    print(f"    {idx + 1}. {row['项目名称']}")
            else:
                print(f"\n未找到 {name} 的项目")
                results[name] = {'count': 0, 'total_funding': 0, 'file_path': None, 'data': pd.DataFrame()}

        # 创建汇总报告
        create_summary_report(output_dir, results, df)
        return results, output_dir
    except FileNotFoundError:
        print(f"错误: 找不到文件 {input_file}")
        return None, None
    except Exception as e:
        print(f"处理过程中出现错误: {str(e)}")
        return None, None

def create_summary_report(output_dir, results, original_df):
    """创建汇总报告"""
    # 创建汇总统计表
    summary_data = []
    for name, data in results.items():
        summary_data.append({
            '项目负责人': name,
            '项目数量': data['count'],
            '总经费(万元)': data['total_funding'],
            '文件保存路径': data['file_path'] if data['file_path'] else '无'
        })
    summary_df = pd.DataFrame(summary_data)
    # 保存汇总统计
    summary_path = os.path.join(output_dir, '项目汇总统计.xlsx')
    summary_df.to_excel(summary_path, index=False, engine='openpyxl')
    # 创建详细报告
    report_path = os.path.join(output_dir, '处理报告.txt')
    with open(report_path, 'w', encoding='utf-8') as f:
        f.write("Excel数据处理报告\n")
        f.write("=" * 50 + "\n")
        f.write(f"处理时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
        f.write(f"原始数据总行数: {len(original_df)}\n")
        f.write(f"原始数据中的项目负责人: {', '.join(original_df['项目负责人'].unique())}\n\n")
        f.write("处理结果:\n")
        for name, data in results.items():
            f.write(f"\n{name}:\n")
            f.write(f"  项目数量: {data['count']}\n")
            f.write(f"  总经费: {data['total_funding']}万元\n")
            if data['file_path']:
                f.write(f"  保存文件: {os.path.basename(data['file_path'])}\n")
    print(f"\n汇总统计已保存到: {summary_path}")
    print(f"详细报告已保存到: {report_path}")

# 主程序
if __name__ == "__main__":
    # 设置输入文件路径
    input_file = "A2-4科研项目-测试.xlsx"
    # 设置要筛选的项目负责人
    target_names = ["凌萧云", "胡棕",'孙鸣']
    print("开始处理Excel文件...")
    print("=" * 50)
    # 处理数据
    results, output_dir = process_excel_by_person_in_charge(input_file, target_names)
    if results:
        print("\n" + "=" * 50)
        print("处理完成!")
        print(f"所有文件已保存到目录: {output_dir}")